package com.tlias.AOP;

import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

// 使用 Lombok 的 @Slf4j 注解，自动生成日志记录器 log
@Slf4j
// 使用 Spring 的 @Component 注解，表示该类是一个 Spring 组件，会被自动扫描并注册为 Bean
//@Component
//// 使用 AspectJ 的 @Aspect 注解，表示该类是一个切面类，用于定义 AOP 拦截逻辑
//@Aspect
//@Order(4)//  设置切面的优先级，数字越小优先级越高,不设置的情况下按照类名的大小进行排序
public class MyAspect1 {
    //  定义切点 pointcut，用于匹配 com.tlias.service.impl 包下的所有方法
    //@Pointcut抽取公共切点表达式配合pointcut()方法,pointcut自己定义都
    @Pointcut("execution(* com.tlias.service.impl.*.*(..))")
    public void pointcut() {}//  定义切点
    @Around("pointcut()")//  定义通知的切点
    public Object test(ProceedingJoinPoint joinPoint) throws Throwable {
        // 调用 joinPoint.proceed() 执行被拦截的目标方法
        // 返回值 result 表示目标方法的返回结果
        log.info("@Around方法执行前MyAspect1");
        Object result = joinPoint.proceed();
        log.info("@Around方法执行后MyAspect1");
        // 返回目标方法的执行结果
        return result;
    }
    //日标方法前触发该通知
//    @Before("pointcut()")
//    public void before() {
//        log.info("@Before方法执行前MyAspect1");
//    }
//    //无论目标方法是否有异常，都会触发该通知
//    @After("pointcut()")
//    public void after() {
//        log.info("@After方法执行后MyAspect1");
//    }
}
